calendar: Fix focus keynav
authorMatthias Clasen <mclasen@redhat.com>
Fri, 17 Apr 2020 06:15:14 +0000 (02:15 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 17 Apr 2020 14:57:36 +0000 (10:57 -0400)
This broke when the calendar was broken into widgets.

gtk/gtkcalendar.c
gtk/theme/Adwaita/_common.scss

index 1f29f68c002531ce7636bf2580c1d8a6422e1b6e..0c524c37266710af5d26f35115bd514170bc760a 100644 (file)
@@ -1181,13 +1181,31 @@ gtk_calendar_scroll_controller_scroll (GtkEventControllerScroll *scroll,
 
 static void
 move_focus (GtkCalendar *calendar,
-            gint         direction)
+            int          direction,
+            int          updown)
 {
   GtkCalendarPrivate *priv = gtk_calendar_get_instance_private (calendar);
   GtkTextDirection text_dir = gtk_widget_get_direction (GTK_WIDGET (calendar));
+  int x, y;
 
-  if ((text_dir == GTK_TEXT_DIR_LTR && direction == -1) ||
-      (text_dir == GTK_TEXT_DIR_RTL && direction == 1))
+  if (updown == 1)
+    {
+      if (priv->focus_row > 0)
+        priv->focus_row--;
+      if (priv->focus_row < 0)
+        priv->focus_row = 5;
+      if (priv->focus_col < 0)
+        priv->focus_col = 6;
+    }
+  else if (updown == -1)
+    {
+      if (priv->focus_row < 5)
+        priv->focus_row++;
+      if (priv->focus_col < 0)
+        priv->focus_col = 0;
+    }
+  else if ((text_dir == GTK_TEXT_DIR_LTR && direction == -1) ||
+           (text_dir == GTK_TEXT_DIR_RTL && direction == 1))
     {
       if (priv->focus_col > 0)
           priv->focus_col--;
@@ -1217,6 +1235,17 @@ move_focus (GtkCalendar *calendar,
       if (priv->focus_row < 0)
         priv->focus_row = 0;
     }
+
+  for (y = 0; y < 6; y ++)
+    for (x = 0; x < 7; x ++)
+      {
+        GtkWidget *label = priv->day_number_labels[y][x];
+
+        if (priv->focus_row == y && priv->focus_col == x)
+          gtk_widget_set_state_flags (label, GTK_STATE_FLAG_FOCUSED, FALSE);
+        else
+          gtk_widget_unset_state_flags (label, GTK_STATE_FLAG_FOCUSED);
+      }
 }
 
 static gboolean
@@ -1247,10 +1276,9 @@ gtk_calendar_key_controller_key_pressed (GtkEventControllerKey *controller,
         calendar_set_month_prev (calendar);
       else
         {
-          move_focus (calendar, -1);
+          move_focus (calendar, -1, 0);
           calendar_invalidate_day (calendar, old_focus_row, old_focus_col);
-          calendar_invalidate_day (calendar, priv->focus_row,
-                                   priv->focus_col);
+          calendar_invalidate_day (calendar, priv->focus_row, priv->focus_col);
         }
       break;
     case GDK_KEY_KP_Right:
@@ -1260,10 +1288,9 @@ gtk_calendar_key_controller_key_pressed (GtkEventControllerKey *controller,
         calendar_set_month_next (calendar);
       else
         {
-          move_focus (calendar, 1);
+          move_focus (calendar, 1, 0);
           calendar_invalidate_day (calendar, old_focus_row, old_focus_col);
-          calendar_invalidate_day (calendar, priv->focus_row,
-                                   priv->focus_col);
+          calendar_invalidate_day (calendar, priv->focus_row, priv->focus_col);
         }
       break;
     case GDK_KEY_KP_Up:
@@ -1273,15 +1300,9 @@ gtk_calendar_key_controller_key_pressed (GtkEventControllerKey *controller,
         calendar_set_year_prev (calendar);
       else
         {
-          if (priv->focus_row > 0)
-            priv->focus_row--;
-          if (priv->focus_row < 0)
-            priv->focus_row = 5;
-          if (priv->focus_col < 0)
-            priv->focus_col = 6;
+          move_focus (calendar, 0, 1);
           calendar_invalidate_day (calendar, old_focus_row, old_focus_col);
-          calendar_invalidate_day (calendar, priv->focus_row,
-                                   priv->focus_col);
+          calendar_invalidate_day (calendar, priv->focus_row, priv->focus_col);
         }
       break;
     case GDK_KEY_KP_Down:
@@ -1291,13 +1312,9 @@ gtk_calendar_key_controller_key_pressed (GtkEventControllerKey *controller,
         calendar_set_year_next (calendar);
       else
         {
-          if (priv->focus_row < 5)
-            priv->focus_row++;
-          if (priv->focus_col < 0)
-            priv->focus_col = 0;
+          move_focus (calendar, 0, -1);
           calendar_invalidate_day (calendar, old_focus_row, old_focus_col);
-          calendar_invalidate_day (calendar, priv->focus_row,
-                                   priv->focus_col);
+          calendar_invalidate_day (calendar, priv->focus_row, priv->focus_col);
         }
       break;
     case GDK_KEY_KP_Space:
@@ -1460,6 +1477,11 @@ gtk_calendar_select_day (GtkCalendar *self,
         else
           gtk_widget_unset_state_flags (label, GTK_STATE_FLAG_SELECTED);
 
+        if (priv->focus_row == y && priv->focus_col == x)
+          gtk_widget_set_state_flags (label, GTK_STATE_FLAG_FOCUSED, FALSE);
+        else
+          gtk_widget_unset_state_flags (label, GTK_STATE_FLAG_FOCUSED);
+
         if (day == today_day &&
             priv->day_month[y][x] == MONTH_CURRENT)
           gtk_widget_add_css_class (label, "today");
index 4361e6979eb4424b054a5b98fc52c95ece0cb7b6..9820a92416eec70b0f6b3c597a07cfbf5fd0b167 100644 (file)
@@ -3468,6 +3468,13 @@ calendar {
       }
     }
 
+    > label:focus {
+      outline-color: $focus_border_color;
+      outline-offset: -2px;
+      outline-width: 2px;
+      outline-style: solid;
+    }
+
     > label.day-number {
       padding: 4px;